package encheres.manager.impl;

import java.util.ArrayList;
import java.util.List;

import org.omg.CORBA.ORB;

import encheres.dao.ICategorieDAO;
import encheres.dao.entities.Categorie;
import encheres.dao.impl.CategorieDAOImpl;
import encheres.manager.corba.C_Categorie;
import encheres.manager.corba.I_CategoriePOA;

/**
 * Implémente le skeleton de Categorie.
 * 
 * @author Nicolas
 * 
 */
public class I_CategorieImpl extends I_CategoriePOA {

	/** bus par lequel les requêtes sur les objets transitent.*/
	private ORB orb;
	/** service DAO pour gérer les objets Categorie avec la BD. */
	private ICategorieDAO categorieDao = new CategorieDAOImpl();

	/**
	 * Liste l'ensemble des catégories mères.
	 * 
	 * @return une liste des catégories mères
	 */
	public C_Categorie[] listerCategoriesMeres() {
		List<Categorie> listeCategories = this.categorieDao.listCategories();
		List<Categorie> listeCategorieMeres = new ArrayList<Categorie>();

		// filtre les catégories mères 
		for (Categorie categorie : listeCategories) {
			if (categorie.getCategorie() == null) {
				listeCategorieMeres.add(categorie);
			}
		}

		// Convertit la liste des catégories mère en tableau C_Categorie[]
		int taille = listeCategorieMeres.size();
		C_Categorie[] tabCategoriesMeres = new C_Categorie[taille];
		for (int i = 0; i < taille; i++) {
			Categorie categorie = listeCategorieMeres.get(i);
			tabCategoriesMeres[i] = new C_Categorie(categorie.getIdCategorie(),
					categorie.getNomCategorie(), -1, "", new int[0],
					new String[0], categorie.getDescriptionCategorie());
		}

		return tabCategoriesMeres;
	}

	/**
	 * Liste les sous-catégories d'une catégorie
	 * 
	 * @param idCategorie l'identifiant en base de données de la catégorie mère
	 * @return une liste des catégories filles
	 */
	public C_Categorie[] listerSousCategories(int idCategorie) {
		List<Categorie> listeCategories = this.categorieDao.listCategories();
		List<Categorie> listeCategoriesFilles = new ArrayList<Categorie>();

		// filtre les catégories filles de la catégorie avec l'id idCategorie 
		for (Categorie categorie : listeCategories) {
			if (categorie.getCategorie() != null
					&& categorie.getCategorie().getIdCategorie() == idCategorie) {
				listeCategoriesFilles.add(categorie);
			}
		}

		// Convertit la liste des catégories filles en tableau C_Categorie[]
		int taille = listeCategoriesFilles.size();
		C_Categorie[] tabCategoriesFilles = new C_Categorie[taille];
		for (int i = 0; i < taille; i++) {
			Categorie categorie = listeCategoriesFilles.get(i);
			tabCategoriesFilles[i] = new C_Categorie(
					categorie.getIdCategorie(), categorie.getNomCategorie(),
					categorie.getCategorie().getIdCategorie(), categorie
							.getCategorie().getNomCategorie(), new int[0],
					new String[0], categorie.getDescriptionCategorie());
		}

		return tabCategoriesFilles;
	}

	/**
	 * Ferme le bus par lequel les requêtes sur les objets transitent.
	 */
	public void shutdown() {
		orb.shutdown(false);
	}
	
	/**
	 * setteur sur le bus par lequel les requêtes sur les objets transitent.
	 * @param orb_val le nouveau bus par lequel les requêtes sur les objets transitent.
	 */
	public void setORB(ORB orb_val) {
		orb = orb_val;
	}

}
